package com.cs.beneficios.web.action;
import com.cs.beneficios.business.entity.AtributosDAO;
import com.cs.beneficios.business.entity.BeneficiarioDAO;
import com.cs.beneficios.business.entity.BeneficioDAO;
import com.cs.beneficios.business.entity.InterfazMELDAO;
import com.cs.beneficios.business.entity.RenovarDAO;
import com.cs.beneficios.business.entity.RestriccionDAO;
import com.cs.beneficios.business.entity.SubProgramaDAO;
import com.cs.beneficios.business.model.AtributoVO;
import com.cs.beneficios.business.model.BeneficiarioVO;
import com.cs.beneficios.business.model.Beneficiario_AtributoVO;
import com.cs.beneficios.business.model.InterfazMELVO;
import com.cs.beneficios.business.model.RenovarVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.paoyer.administration.business.model.UserVO;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import java.io.IOException;

import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RenovarMasivaOtorgarAction extends Action 
{
  /**
   * This is the main action called from the Struts framework.
   * @param mapping The ActionMapping used to select this instance.
   * @param form The optional ActionForm bean for this request.
   * @param request The HTTP Request we are processing.
   * @param response The HTTP Response we are processing.
   * @return 
   * @throws java.io.IOException
   * @throws javax.servlet.ServletException
   */
  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
    //ConnectionFactory cf = new ConnectionFactory("beneficios","beneficios");
	ConnectionFactory cf = new ConnectionFactory();
    HttpSession session = request.getSession();
    //Proceso para la auditoria
     UserVO user = (UserVO) request.getSession().getAttribute("userInfo");
     String terminalAddress = request.getRemoteAddr();
     String strTerminal = ("WEB="+terminalAddress);
     Calendar c = Calendar.getInstance(); 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");   
    //Fin del proceso
    String strCodeSubpro = (String)session.getAttribute("codBeneficio");
    List lbeneficiarios = new LinkedList();
    lbeneficiarios = (List)session.getAttribute("LBeneficiarios");
    int NumBene = 0;
    boolean disponibilidad = true;
    boolean insertar = true;
    
    String strCodeProg = (String)session.getAttribute("CodePrograma");
    String strCodeSubPro = (String)session.getAttribute("CodeSubprograma");
    String strCodeSede = (String)session.getAttribute("CodeSede");
    String strEdad = null;
    String strFechaActual = null;
    String strCodeAtriDate = null;
    String strPosition = null;
    
    int compara1 =0;
    int compara2 =0;
    int continuar = 0;
    RestriccionDAO objRestDAO;
    
    List lAtriBeneficio = null;
    List beneficiario = new LinkedList();
    List lInsertar = new LinkedList();
    List lAtriNoRestric = new LinkedList();
    List lAtriAlerta = new LinkedList();
    List lError = new LinkedList();
    List lCorrecto = new LinkedList();
    
    
    BeneficiarioVO beneVO = null;
    
    String strnombre = "";
    for(int i=0;i<lbeneficiarios.size();i++)
    {
      strnombre = "beneficiario"+i;
      Object valor = (Object)request.getParameter(strnombre);
      if(valor != null)
      {
        NumBene++;
      }
    }
    
    try
    {
      //Proceso para saber los dias de reutilizacion y los dias a renovar
      Long loCodigoSubp = new Long(strCodeSubpro);
      SubProgramaDAO objSubProgramaDAO = new SubProgramaDAO(cf);
      SubProgramaVO objsubproVO = new SubProgramaVO();
      objsubproVO = objSubProgramaDAO.GetPropiedadesSubpro(loCodigoSubp);
      String reutilizar = objsubproVO.getDiasReutilizar();
      String renovacion = objsubproVO.getDiasRenovacion();
      int dreutilizar = Integer.parseInt(reutilizar.trim());
      int drenovacion = Integer.parseInt(renovacion.trim());
      double lreutilizar = dreutilizar;
      double lrenovacion = drenovacion;
      double total = lrenovacion/lreutilizar;
      long totaldias = Math.round(total);
      cf.closeConnection(objSubProgramaDAO.getConn());
      //Fin del proceso
      
      //Proceso para determinar si hay beneficios
      BeneficioDAO objBeneDAO = new BeneficioDAO(cf);
      int disponible = objBeneDAO.GetDisponibilidad(strCodeSede,strCodeSubpro);
      
      if((NumBene*Integer.parseInt(totaldias+"")) > disponible)
      {
        disponibilidad = false;
      }
      //Fin del proceso
      
      if(disponibilidad)
      {
        //Proceso para traer los atributos del beneficio
        Collection atributos = null;
        AtributosDAO objAtributoDAO;
        objAtributoDAO = new AtributosDAO(cf);
        atributos = objAtributoDAO.GetAtributos(strCodeSubPro,"A",0);
        cf.closeConnection(objAtributoDAO.getConn());
        //session.setAttribute("ListaAtributos",atributos);
        //fin del proceso
        for(int j=0;j<lbeneficiarios.size();j++)
        {
          lAtriBeneficio = new LinkedList();
          lInsertar.removeAll(lInsertar);
          strnombre = "beneficiario"+j;
          String strCodeBeneficiario = "";
          Object valor = (Object)request.getParameter(strnombre);
          if(valor != null)
          {
          
          // Proceso para traer la informacion con la interfaz
            try
              {
                strCodeBeneficiario = request.getParameter(strnombre);
                SubProgramaVO subproVO = new SubProgramaVO();
                subproVO.setCode(new Long(strCodeSubpro));
                SubProgramaDAO subproDAO = new SubProgramaDAO(cf);
                List subpro = (List)subproDAO.findSubProgramaByCriterea(subproVO,user.getCode(), user.getUserGroupName(),user.getCodeArea());
                List lInsert = new LinkedList();
                if(subpro != null && subpro.size()>0)
                {
                  subproVO = (SubProgramaVO)subpro.get(0);
                  if(subproVO.getValidarSisben().equals("S"))
                  {
                      //Buscando el beneficiario en la bd del sisben
                    beneVO = new BeneficiarioVO();
                    beneVO.setCode(new Long(strCodeBeneficiario));
                    BeneficiarioDAO beneDAO;
                    try
                    {
                      beneDAO  = new BeneficiarioDAO(cf);
                      beneficiario = (List)beneDAO.findBeneficiarioByCriterea(beneVO,"");
                      if(beneficiario != null && beneficiario.size()>0)
                      {
                        beneVO = (BeneficiarioVO)beneficiario.get(0);
                        BeneficiarioVO beneSisbenVO = new BeneficiarioVO();
                        //empezando a buscar el beneficiario en sisben por todos los criterios
                        beneSisbenVO.setTipoDocumento(beneVO.getTipoDocumento());
                        beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                        beneSisbenVO.setNombre1(beneVO.getNombre1());
                        beneSisbenVO.setNombre2(beneVO.getNombre2());
                        beneSisbenVO.setPrimerApellido(beneVO.getPrimerApellido());
                        beneSisbenVO.setSegundoApellido(beneVO.getSegundoApellido());
                        beneSisbenVO.setFechaNacimiento(beneVO.getFechaNacimiento());
                        List beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                        boolean encontro = false;
                        if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                        {
                          encontro = true;
                        }else
                        {
                          beneSisbenVO =  new BeneficiarioVO();
                          beneSisbenVO.setNombre1(beneVO.getNombre1());
                          beneSisbenVO.setNombre2(beneVO.getNombre2());
                          beneSisbenVO.setPrimerApellido(beneVO.getPrimerApellido());
                          beneSisbenVO.setSegundoApellido(beneVO.getSegundoApellido());
                          beneSisbenVO.setFechaNacimiento(beneVO.getFechaNacimiento());
                          beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                          if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                          {
                            encontro = true;
                          }else
                          {
                            beneSisbenVO =  new BeneficiarioVO();
                            beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                            beneSisbenVO.setNombre1(beneVO.getNombre1());
                            beneSisbenVO.setNombre2(beneVO.getNombre2());
                            beneSisbenVO.setPrimerApellido(beneVO.getPrimerApellido());
                            beneSisbenVO.setSegundoApellido(beneVO.getSegundoApellido());
                            beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                            if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                            {
                              encontro = true;
                            }else
                            {
                              beneSisbenVO =  new BeneficiarioVO();
                              beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                              beneSisbenVO.setNombre1(beneVO.getNombre1());
                              beneSisbenVO.setPrimerApellido(beneVO.getPrimerApellido());
                              beneSisbenVO.setFechaNacimiento(beneVO.getFechaNacimiento());
                              beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                              if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                              {
                                encontro = true;
                              }else
                              {
                                beneSisbenVO =  new BeneficiarioVO();
                                beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                                beneSisbenVO.setNombre1(beneVO.getNombre1());
                                beneSisbenVO.setPrimerApellido(beneVO.getPrimerApellido());
                                beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                                if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                                {
                                  encontro = true;
                                }else
                                {
                                  beneSisbenVO =  new BeneficiarioVO();
                                  beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                                  beneSisbenVO.setNombre2(beneVO.getNombre2());
                                  beneSisbenVO.setSegundoApellido(beneVO.getSegundoApellido());
                                  beneSisbenVO.setFechaNacimiento(beneVO.getFechaNacimiento());
                                  beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                                  if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                                  {
                                    encontro = true;
                                  }else
                                  {
                                    beneSisbenVO =  new BeneficiarioVO();
                                    beneSisbenVO.setTipoDocumento(beneVO.getTipoDocumento());
                                    beneSisbenVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                                    beneficiarioSisben = (List)beneDAO.findBeneficiarioSisben(beneSisbenVO);
                                    if(beneficiarioSisben != null && beneficiarioSisben.size()>0)
                                    {
                                      encontro = true;
                                      //session.setAttribute("ListaSisben",beneficiarioSisben);
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                        cf.closeConnection(beneDAO.getConn());
                        if(!encontro)
                        {
                          request.setAttribute("msgsisben","El beneficiario no se encontro en Sisben por lo tanto no se le puede otorgar un beneficio que valide contra Sisben.");
                          return mapping.findForward("verbeneficio");
                        }else
                        {
                          if(beneficiarioSisben.size()==1)
                          {
                              if(subpro != null && subpro.size()>0)
                              {
                                subproVO = (SubProgramaVO)subpro.get(0);
                                
                                  List atri = (List)atributos;
                                  if(atri != null && atri.size()>0)
                                  {
                                    AtributoVO atributo = null;
                                    beneVO = (BeneficiarioVO)beneficiarioSisben.get(0);
                                    for(int i=0;i<atri.size();i++)
                                    {
                                      atributo = (AtributoVO)atri.get(i);
                                      
                                      if(atributo.getNombre().equals("NIVEL SISBEN"))
                                      {
                                        lAtriBeneficio.add("NIVEL SISBEN");
                                        lAtriBeneficio.add(beneVO.getNivelSisben());
                                      }
                                      if(atributo.getNombre().equals("PUNTAJE"))
                                      {
                                        lAtriBeneficio.add("PUNTAJE");
                                        lAtriBeneficio.add(beneVO.getPuntajeSisben());
                                      }
                                    }
                                  }
                              }
                          } 
                        }          
                      }
                      
                    }catch(SQLException e)
                    {
						System.err.println("/******** TDSUB - cwsub");
						e.printStackTrace();
						System.err.println("TDSUB - cwsub ********/");
                    }
                      //fin interfaz SISBEN
                  }
                }
                cf.closeConnection(subproDAO.getConn());
                        
                //inicio interfaz MATRICULA EN LINEA
                
                if(subpro != null && subpro.size()>0)
                {
                  subproVO = (SubProgramaVO)subpro.get(0);
                  if(subproVO.getValidarEstud().equals("S"))
                  {
                      beneVO = new BeneficiarioVO();
                      beneVO.setCode(new Long(strCodeBeneficiario));
                      BeneficiarioDAO beneDAO;
                      boolean encontro = false;
                      try
                      {
                        beneDAO  = new BeneficiarioDAO(cf);
                        beneficiario = (List)beneDAO.findBeneficiarioByCriterea(beneVO,"");
                        if(beneficiario != null && beneficiario.size()>0)
                        {
                          beneVO = (BeneficiarioVO)beneficiario.get(0);
                          BeneficiarioVO beneMLVO = new BeneficiarioVO();
                          //empezando a buscar el beneficiario en ML por tipo y numero de documento
                          beneMLVO.setTipoDocumento(beneVO.getTipoDocumento());
                          beneMLVO.setNumeroDocumento(beneVO.getNumeroDocumento());
                          List beneficiarioMEL = (List)beneDAO.findBeneficiarioMEL(beneMLVO);
                          
                          if(beneficiarioMEL != null && beneficiarioMEL.size()>0)
                          {
                            encontro = true;
                            InterfazMELDAO MELDAO = new InterfazMELDAO(cf);
                            List camposMEL = MELDAO.getCamposGenericos(beneVO);
                            if(camposMEL != null && camposMEL.size()>0)
                            {
                              List atri = (List)atributos;
                              if(atri != null && atri.size()>0)
                              {
                                AtributoVO atributo = null;
                                InterfazMELVO MELVO = (InterfazMELVO)camposMEL.get(0);
                                for(int i=0;i<atri.size();i++)
                                {
                                  atributo = (AtributoVO)atri.get(i);
                                  if(atributo.getNombre().equals("NOMBRE PADRE"))
                                  {
                                    lAtriBeneficio.add("NOMBRE PADRE");
                                    lAtriBeneficio.add(MELVO.getNomPadre());
                                  }
                                  if(atributo.getNombre().equals("CEDULA PADRE"))
                                  {
                                    lAtriBeneficio.add("CEDULA PADRE");
                                    lAtriBeneficio.add(MELVO.getCedulaPadre());
                                  }
                                  if(atributo.getNombre().equals("TELEFONO PADRE"))
                                  {
                                    lAtriBeneficio.add("TELEFONO PADRE");
                                    lAtriBeneficio.add(MELVO.getTelPadre());
                                  }
                                  if(atributo.getNombre().equals("NOMBRE MADRE"))
                                  {
                                    lAtriBeneficio.add("NOMBRE MADRE");
                                    lAtriBeneficio.add(MELVO.getNomMadre());
                                  }
                                  if(atributo.getNombre().equals("CEDULA MADRE"))
                                  {
                                    lAtriBeneficio.add("CEDULA MADRE");
                                    lAtriBeneficio.add(MELVO.getCedulaMadre());
                                  }
                                  if(atributo.getNombre().equals("TELEFONO MADRE"))
                                  {
                                    lAtriBeneficio.add("TELEFONO MADRE");
                                    lAtriBeneficio.add(MELVO.getTelMadre());
                                  }
                                  if(atributo.getNombre().equals("NOMBRE ACUDIENTE"))
                                  {
                                    lAtriBeneficio.add("NOMBRE ACUDIENTE");
                                    lAtriBeneficio.add(MELVO.getNomAcu());
                                  }
                                  if(atributo.getNombre().equals("CEDULA ACUDIENTE"))
                                  {
                                    lAtriBeneficio.add("CEDULA ACUDIENTE");
                                    lAtriBeneficio.add(MELVO.getCedulaAcu());
                                  }
                                  if(atributo.getNombre().equals("TELEFONO ACUDIENTE"))
                                  {
                                    lAtriBeneficio.add("TELEFONO ACUDIENTE");
                                    lAtriBeneficio.add(MELVO.getTelAcu());
                                  }
                                  if(atributo.getNombre().equals("INSTITUCI�N EDUCATIVA"))
                                  {
                                    lAtriBeneficio.add("INSTITUCI�N EDUCATIVA");
                                    lAtriBeneficio.add(MELVO.getNomInstitucion());
                                  }
                                  if(atributo.getNombre().equals("DIRECCI�N INST. EDUCATIVA"))
                                  {
                                    lAtriBeneficio.add("DIRECCI�N INST. EDUCATIVA");
                                    lAtriBeneficio.add(MELVO.getDirInstitucion());
                                  }
                                  if(atributo.getNombre().equals("TELEFONO INST. EDUCATIVA"))
                                  {
                                    lAtriBeneficio.add("TELEFONO INST. EDUCATIVA");
                                    lAtriBeneficio.add(MELVO.getTelInstitucion());
                                  }
                                  if(atributo.getNombre().equals("NOMBRE SEDE"))
                                  {
                                    lAtriBeneficio.add("NOMBRE SEDE");
                                    lAtriBeneficio.add(MELVO.getNomSede());
                                  }
                                  if(atributo.getNombre().equals("DIRECCION SEDE"))
                                  {
                                    lAtriBeneficio.add("DIRECCION SEDE");
                                    lAtriBeneficio.add(MELVO.getDirSede());
                                  }
                                  if(atributo.getNombre().equals("TELEFONO SEDE"))
                                  {
                                    lAtriBeneficio.add("TELEFONO SEDE");
                                    lAtriBeneficio.add(MELVO.getTelSede());
                                  }
                                  if(atributo.getNombre().equals("GRADO"))
                                  {
                                    lAtriBeneficio.add("GRADO");
                                    lAtriBeneficio.add(MELVO.getGrado());
                                  }
                                  if(atributo.getNombre().equals("JORNADA"))
                                  {
                                    lAtriBeneficio.add("JORNADA");
                                    lAtriBeneficio.add(MELVO.getJornada());
                                  }
                                  if(atributo.getNombre().equals("NUCLEO EDUCATIVO"))
                                  {
                                    lAtriBeneficio.add("NUCLEO EDUCATIVO");
                                    lAtriBeneficio.add(MELVO.getNucleo());
                                  }
                                }
                                int ss = 0;
                              }
                            }
                            cf.closeConnection(MELDAO.getConn());
                            //session.setAttribute("ListaMEL",camposMEL);
                          }
                        }
                        cf.closeConnection(beneDAO.getConn());
                      }catch(SQLException e)
                      {
						System.err.println("/******** TDSUB - cwsub");
						e.printStackTrace();
						System.err.println("TDSUB - cwsub ********/");
                      }
            
                      
                      if(!encontro)
                      {
                        request.setAttribute("msgmel","El beneficiario no se encontro en Matricula en Linea por lo tanto no se le puede otorgar un beneficio que valide contra Matricula en Linea.");
                        return mapping.findForward("verbeneficio");
                      }
                  }
                }
    
                //fin interfaz MATRICULA EN LINEA
                
                // proceso que traer el resto de la informacion
                 RenovarDAO objRenovar = null;
                 objRenovar = new RenovarDAO(cf);
                 List latributos = (List)objRenovar.GetAtributosSubpro(strCodeSubPro);
                 List lBotSede = (List)objRenovar.GetBeneficioOtorgado(strCodeSubPro,strCodeBeneficiario);
                 cf.closeConnection(objRenovar.getConn());
                 session.setAttribute("codesede",(String)lBotSede.get(1));
                 for(int i=0;i<latributos.size();i++)
                 {
                   AtributoVO atrivo = new AtributoVO();
                   atrivo = (AtributoVO)latributos.get(i);
                   /*if(atrivo.getTipoatributo().equals("R"))
                   {*/
                   if((atrivo.getNombre()).equals("EDAD"))
                   {
                     BeneficiarioVO objBeneVO = new BeneficiarioVO();
                     objBeneVO = (BeneficiarioVO)lbeneficiarios.get(j);
                     BeneficiarioDAO objBeneficiario = new BeneficiarioDAO(cf);
                     strEdad = objBeneficiario.FindEdad((objBeneVO.getCode()).toString());
                     if(strEdad != null && !strEdad.equals(""))
                     {
                       // Proceso para calcular la edad
                       /*Calendar calendario= Calendar.getInstance();
                       strFechaActual=(calendario.get(Calendar.DAY_OF_MONTH)<10?"0":"")+calendario.get(Calendar.DAY_OF_MONTH)+"/"+
                                      ((calendario.get(Calendar.MONTH)+1)<10?"0":"")+(calendario.get(Calendar.MONTH)+1)+"/"+calendario.get(Calendar.YEAR);
                       
                       String ArrFechaActual[] = strFechaActual.split("/");
                       String strDayAc = ArrFechaActual[0];
                       String strMonthAc = ArrFechaActual[1];                       
                       String strYearAc = ArrFechaActual[2];
                       
                       String ArrFechaNacimiento[] = strFechaNacimiento.split("/");
                       String strDayNa = ArrFechaNacimiento[0];
                       String strMonthNa = ArrFechaNacimiento[1];                       
                       String strYearNa = ArrFechaNacimiento[2];
                       
                       //resto los a�os de las dos fechas 
                       int iEdad = Integer.parseInt(strYearAc) - Integer.parseInt(strYearNa) - 1; //-1 porque no se si ha cumplido a�os ya este a�o
                       
                       //si resto los meses y me da menor que 0 entonces no ha cumplido a�os. Si da mayor si ha cumplido 
                       if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) > 0)
                         iEdad +=1;
                                                 
                         if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) == 0)
                         {
                           //si resto los dias y me da menor que 0 entonces no ha cumplido a�os. Si da mayor o igual si ha cumplido 
                           if (((Integer.parseInt(strDayAc)) - (Integer.parseInt(strDayNa))) >= 0)
                             iEdad +=1;
                           }*/
                           lAtriBeneficio.add(atrivo.getNombre());
                           lAtriBeneficio.add(strEdad);
                           //lAtriBeneficio.add(String.valueOf(iEdad));
                           // Fin del proceso
                         }else
                         {
                           /*objRenovar = new RenovarDAO(cf);
                           String strValor = objRenovar.Getbeneficiarioatri(atrivo.getTipodato(),strCodeBeneficiario,atrivo.getCodatributo());
                           cf.closeConnection(objRenovar.getConn());
                           RenovarVO renovarvo = new RenovarVO();
                                          
                           if(strValor != null && !strValor.equals(""))
                           {
                             lAtriBeneficio.add(atrivo.getNombre());
                             lAtriBeneficio.add(strValor);
                           }else
                           {
                             lAtriBeneficio.add(atrivo.getNombre());
                             lAtriBeneficio.add("");
                           }*/
                                                
                           if(lBotSede.size() > 0)
                           {
                             objRenovar = new RenovarDAO(cf);
                             String strBeneOtor = (String)lBotSede.get(0);
                             ResultSet rst = objRenovar.Getbeneficioatri(atrivo.getTipodato(),strBeneOtor,atrivo.getCodatributo());
                             RenovarVO renovarvo = new RenovarVO();
                             if(rst.next())
                             {
                               lAtriBeneficio.add(atrivo.getNombre());
                               lAtriBeneficio.add(rst.getString("valor"));
                             }else
                             {
                               lAtriBeneficio.add(atrivo.getNombre());
                               lAtriBeneficio.add("");
                             }
                               cf.closeConnection(objRenovar.getConn());
                             }
                           }
                           /*}else
                           {
                             objRenovar = new RenovarDAO(cf);
                             String strValor = objRenovar.Getbeneficiarioatri(atrivo.getTipodato(),strCodeBeneficiario,atrivo.getCodatributo());
                             cf.closeConnection(objRenovar.getConn());
                             RenovarVO renovarvo = new RenovarVO();
                             if(strValor != null && !strValor.equals(""))
                             {
                               lAtriBeneficio.add(atrivo.getNombre());
                               lAtriBeneficio.add(strValor);
                             }else
                             {
                               lAtriBeneficio.add(atrivo.getNombre());
                               lAtriBeneficio.add("");
                             }
                           }*/
                   }else
                   {
                     if(lBotSede.size() > 0)
                     {
                       objRenovar = new RenovarDAO(cf);
                       String strBeneOtor = (String)lBotSede.get(0);
                       ResultSet rst = objRenovar.Getbeneficioatri(atrivo.getTipodato(),strBeneOtor,atrivo.getCodatributo());
                       RenovarVO renovarvo = new RenovarVO();
                       if(rst.next())
                       {
                         lAtriBeneficio.add(atrivo.getNombre());
                         lAtriBeneficio.add(rst.getString("valor"));
                       }else
                       {
                         lAtriBeneficio.add(atrivo.getNombre());
                         lAtriBeneficio.add("");
                       }
                       cf.closeConnection(objRenovar.getConn());
                     }
                   }
                }
                 
                //fin del proceso
                
                // Proceso para validar restricciones
                 if(atributos.size() > 0)
                 {
                   int tamanolatri = atributos.size();
                   List lAtributo = (List)atributos;
                   for(int i=0;i<tamanolatri;i++)
                   {
                        Beneficiario_AtributoVO objBenAtriVO = new Beneficiario_AtributoVO();
                        AtributoVO atrirestri = (AtributoVO)lAtributo.get(i);
                        String strCodiAtri = atrirestri.getCodatributo();
                        String strCodiRest = atrirestri.getRestriccion();
                        String strTipoAtri = atrirestri.getTipoatributo();
                        String strNombre = atrirestri.getNombre();
                        String tipodato = atrirestri.getTipodato();
                        String variable = "";
                        
                        for(int k=0;k<lAtriBeneficio.size();k+=2)
                        {
                          String strNombre2 = (String)lAtriBeneficio.get(k);
                          if(strNombre.equals(strNombre2))
                          {
                            variable = (String)lAtriBeneficio.get(k+1);
                            break;
                          }
                        }
                        
                        if((Object)strCodiRest != null)
                        {
                            try
                            {
                               objRestDAO = new RestriccionDAO(cf);
                               String ArrRest[] = objRestDAO.ValidarRestriccion(strCodiAtri,strCodiRest,variable,tipodato);
                               cf.closeConnection(objRestDAO.getConn());
                               if(ArrRest[0].equals("N"))
                               {
                                 if(ArrRest[1].equals("true"))
                                 {
                                  
                                     session.setAttribute("mensajes","1");
                                  
                                   
                                   if(strTipoAtri.equals("R"))
                                   {
                                      objBenAtriVO.setVariable(variable);
                                      objBenAtriVO.setTipodato(tipodato);
                                      objBenAtriVO.setCodigoatributo(strCodiAtri);
                                      objBenAtriVO.setCodbeneficiario(strCodeBeneficiario);
                                      objBenAtriVO.setTipoatributo(strTipoAtri);
                                      lInsertar.add(objBenAtriVO);
                                      
                                   }else
                                   {
                                      objBenAtriVO.setVariable(variable);
                                      objBenAtriVO.setTipodato(tipodato);
                                      objBenAtriVO.setCodigoatributo(strCodiAtri);
                                      objBenAtriVO.setTipoatributo(strTipoAtri);
                                      lInsertar.add(objBenAtriVO);
                                     
                                   }
                                 }else
                                 {
                                   insertar = false;
                                   
                                   session.setAttribute("mensajes","2");
                                   atrirestri.setDescrest(ArrRest[2]);
                                   String ver = atrirestri.getDescrest();          
                                   int sw1=0;
                                   for(int k=0;k<lAtriNoRestric.size();k++)
                                   {
                                     AtributoVO atribVO = new AtributoVO();
                                     atribVO = (AtributoVO)lAtriNoRestric.get(k);
                                     String strCodeRest = atribVO.getCodigo();
                                     if(atribVO.getRestriccion().equals(strCodiRest))
                                     {
                                        sw1=1;
                                        break;
                                     }
                                   }
                                   if(sw1==0)
                                    lAtriNoRestric.add(atrirestri);
                                   
                                 }
                               }else
                               {
                                  if(ArrRest[1].equals("false"))
                                  {
                                     session.setAttribute("mensajes","3");
                                     atrirestri.setDescrest(ArrRest[2]);
                                     int sw1=0;
                                     for(int k=0;k<lAtriNoRestric.size();k++)
                                     {
                                       AtributoVO atribVO = new AtributoVO();
                                       atribVO = (AtributoVO)lAtriNoRestric.get(k);
                                       String strCodeRest = atribVO.getCodigo();
                                       if(atribVO.getRestriccion().equals(strCodiRest))
                                       {
                                          sw1=1;
                                          break;
                                       }
                                     }
                                     if(sw1==0)
                                      lAtriNoRestric.add(atrirestri);
                                     
                                  }
                                  if(strTipoAtri.equals("R"))
                                  {
                                     objBenAtriVO.setVariable(variable);
                                     objBenAtriVO.setTipodato(tipodato);
                                     objBenAtriVO.setCodigoatributo(strCodiAtri);
                                     objBenAtriVO.setCodbeneficiario(strCodeBeneficiario);
                                     objBenAtriVO.setTipoatributo(strTipoAtri);
                                     lInsertar.add(objBenAtriVO);
                                  }else
                                  {
                                     objBenAtriVO.setVariable(variable);
                                     objBenAtriVO.setTipodato(tipodato);
                                     objBenAtriVO.setCodigoatributo(strCodiAtri);
                                     objBenAtriVO.setTipoatributo(strTipoAtri);
                                     lInsertar.add(objBenAtriVO);
                                  }
                               }                    
                            }catch(SQLException e){
								System.err.println("/******** TDSUB - cwsub");
								e.printStackTrace();
								System.err.println("TDSUB - cwsub ********/");
                            }
                        }else
                        {
                          if(strTipoAtri.equals("R"))
                          {
                             objBenAtriVO.setVariable(variable);
                             objBenAtriVO.setTipodato(tipodato);
                             objBenAtriVO.setCodigoatributo(strCodiAtri);
                             objBenAtriVO.setCodbeneficiario(strCodeBeneficiario);
                             objBenAtriVO.setTipoatributo(strTipoAtri);
                             lInsertar.add(objBenAtriVO);
                          }else
                          {
                             objBenAtriVO.setVariable(variable);
                             objBenAtriVO.setTipodato(tipodato);
                             objBenAtriVO.setCodigoatributo(strCodiAtri);
                             objBenAtriVO.setTipoatributo(strTipoAtri);
                             lInsertar.add(objBenAtriVO);
                           }
                        }
                   }
                 }
                //Fin del proceso
                
                 if(lAtriNoRestric.size() == 0)
                 {
                    //Proceso para validar campos obligatorios
                    List latri = (List)atributos;
                    int sw=0;
                    for(int f=0;f<latri.size();f++)
                    {
                      AtributoVO atri = (AtributoVO)latri.get(f);
                      String obligacion = atri.getObligatorio();
                      String codAtri1 = atri.getCodatributo();
                      if(obligacion.equals("S"))
                      {
                        for(int g=0;g<lInsertar.size();g++)
                        {
                          compara1++;
                          Beneficiario_AtributoVO batrivo = new Beneficiario_AtributoVO();
                          batrivo = (Beneficiario_AtributoVO)lInsertar.get(g);
                          String codAtri2 = batrivo.getCodigoatributo();
                          if(codAtri1.equals(codAtri2))
                          {
                            if(!batrivo.getVariable().equals(""))
                            {
                              compara2++; 
                              break;
                            }else
                            {
                               BeneficiarioVO benefVO = (BeneficiarioVO)lbeneficiarios.get(j);
                               lError.add(benefVO);
                               sw=1;
                               break;
                            }
                          }
                        }
                        if(sw==1)
                        {
                          break;
                        }
                       
                      }
                    }
                    //Fin del proceso
                 }else
                 {
                   request.setAttribute("msgrest","Es posible que algunos campos no cumplan con las siguientes restricciones");
                 }
              }catch(SQLException e)
              {
				System.err.println("/******** TDSUB - cwsub");
				e.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
              }
            //Fin del proceso
            if((lAtriNoRestric.size()>0))
            {
              BeneficiarioVO benefVO = (BeneficiarioVO)lbeneficiarios.get(j);
              lError.add(benefVO);
            }else
            {
            
              if(compara1 == compara2)
              {
                //Proceso para insetar en la tabla beneficio otorgado
               
                Long loCodigoSede = new Long(strCodeSede);
                Long loCodigoBenefi = new Long(strCodeBeneficiario);
                
                // Proceso para identificar si el beneficio tiene el atributo EDAD
                for(int i=0;i<lInsertar.size();i++)
                {
                  Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO)lInsertar.get(i);
                  AtributosDAO objAtributosDAO = new AtributosDAO(cf);
                  String strNameAtri = objAtributosDAO.GetNameAtri(objBenefiVO.getCodigoatributo());
                  cf.closeConnection(objAtributosDAO.getConn());
                  if (strNameAtri != null && !strNameAtri.equals(""))
                  {
                    if(strNameAtri.equals("EDAD"))
                    {
                      strCodeAtriDate = objBenefiVO.getCodigoatributo();
                      strPosition = String.valueOf(i);
                      break;
                    }
                  }
                }
                // Fin del proceso
                
                // Proceso para obtener el valor del beneficio
                String strCostBene = null;
                BeneficioDAO objBenefDAO = new BeneficioDAO(cf);
                strCostBene = objBenefDAO.getCostBenefit(strCodeSubPro);
                cf.closeConnection(objBenefDAO.getConn());
                if(strCostBene != null)
                {
                  request.setAttribute("CostBene", strCostBene);
                }
                // Fin del proceso
                
                // Proceso para convertir la fecha
                String strDateBenefit = dateFormat.format(c.getTime());
                //Fin del proceso 
                int d = 0;
                boolean insertbien = false;
                String strArrAct[] = {user.getName(), strTerminal};
                for(int i=0;i<totaldias;i++)
                {
                  insertbien = objBeneDAO.OtorgarBeneficios(loCodigoSede, loCodigoSubp,loCodigoBenefi, lInsertar, "",d,strArrAct,strCostBene,strDateBenefit);
                  d+=dreutilizar;
                  if(strCodeAtriDate != null && !strCodeAtriDate.equals(""))
                  {
                                       
                    // Proceso para calcular la edad al momento de otorgar el otro beneficio
                    /*AtributosDAO objAtriDAO = new AtributosDAO(cf);
                    String strDate = objAtriDAO.GetDateBeneficio(String.valueOf(d));
                    cf.closeConnection(objAtriDAO.getConn());
                    
                    String ArrFechaActual[] = strDate.split("/");
                    String strDayAc = ArrFechaActual[0];
                    String strMonthAc = ArrFechaActual[1];                       
                    String strYearAc = ArrFechaActual[2];
                    
                    String ArrFechaNacimiento[] = strFechaNacimiento.split("/");
                    String strDayNa = ArrFechaNacimiento[0];
                    String strMonthNa = ArrFechaNacimiento[1];                       
                    String strYearNa = ArrFechaNacimiento[2];
                    
                    //resto los a�os de las dos fechas 
                     int iEdad = Integer.parseInt(strYearAc) - Integer.parseInt(strYearNa) - 1; //-1 porque no se si ha cumplido a�os ya este a�o
                    
                    //si resto los meses y me da menor que 0 entonces no ha cumplido a�os. Si da mayor si ha cumplido 
                    if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) > 0)
                      iEdad +=1;
                    
                    if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) == 0)
                    {
                      //si resto los dias y me da menor que 0 entonces no ha cumplido a�os. Si da mayor o igual si ha cumplido 
                      if (((Integer.parseInt(strDayAc)) - (Integer.parseInt(strDayNa))) >= 0)
                         iEdad +=1;
                    }*/
                    
                    // Fin del Proceso
                    
                    // Proceso para asignar el nuevo valor
                    Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO)lInsertar.get(Integer.parseInt(strPosition));
                    objBenefiVO.setVariable(String.valueOf(strEdad));
                    objBenefiVO.setTipodato(objBenefiVO.getTipodato());
                    objBenefiVO.setCodigoatributo(objBenefiVO.getCodigoatributo());
                    objBenefiVO.setCodbeneficiario(objBenefiVO.getCodbeneficiario());
                    objBenefiVO.setCodbeneotorgado(objBenefiVO.getCodbeneotorgado());
                    objBenefiVO.setTipoatributo(objBenefiVO.getTipoatributo());
                    
                    lInsertar.remove((Integer.parseInt(strPosition)));
                    strPosition = String.valueOf(lInsertar.size());
                    lInsertar.add(objBenefiVO);
                    // Fin del proceso
                  }
                  ////////////////////////////////////
                  
                }
                if(insertbien)
                {
                   BeneficiarioVO benefVO = (BeneficiarioVO)lbeneficiarios.get(j);
                   lCorrecto.add(benefVO);
                }
                // fin del proceso
              }else
              {
                request.setAttribute("msgoblig","Es posible que hayan campos vacios y que son obligatorios");
              }
            }
          }
        }
        if(lError.size()>0)
          request.setAttribute("ListaError",lError);
        if(lCorrecto.size()>0)
          request.setAttribute("ListaCorrectos",lCorrecto);
        if(lAtriNoRestric.size()>0)
        request.setAttribute("ListaNoRestric",lAtriNoRestric);
      }else
      {
        request.setAttribute("msgdisp","No hay beneficios disponibles en la sede seleccionada.");
      }
      cf.closeConnection(objBeneDAO.getConn());
    }catch(SQLException e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
    }
    
    return mapping.findForward("success");
  }
}